/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entidade.persistencia;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author victorinox
 */
@Entity
@Table(name = "funcionario", catalog = "carlossa03", schema = "")
@NamedQueries({@NamedQuery(name = "Funcionario.findAll", query = "SELECT f FROM Funcionario f"), @NamedQuery(name = "Funcionario.findByFuncionarioId", query = "SELECT f FROM Funcionario f WHERE f.funcionarioId = :funcionarioId"), @NamedQuery(name = "Funcionario.findByDataAdmissao", query = "SELECT f FROM Funcionario f WHERE f.dataAdmissao = :dataAdmissao"), @NamedQuery(name = "Funcionario.findByDataNascimento", query = "SELECT f FROM Funcionario f WHERE f.dataNascimento = :dataNascimento"), @NamedQuery(name = "Funcionario.findByCbo", query = "SELECT f FROM Funcionario f WHERE f.cbo = :cbo"), @NamedQuery(name = "Funcionario.findByCtps", query = "SELECT f FROM Funcionario f WHERE f.ctps = :ctps"), @NamedQuery(name = "Funcionario.findBySerie", query = "SELECT f FROM Funcionario f WHERE f.serie = :serie"), @NamedQuery(name = "Funcionario.findByCpf", query = "SELECT f FROM Funcionario f WHERE f.cpf = :cpf"), @NamedQuery(name = "Funcionario.findByRg", query = "SELECT f FROM Funcionario f WHERE f.rg = :rg"), @NamedQuery(name = "Funcionario.findByOrgaoExpedicao", query = "SELECT f FROM Funcionario f WHERE f.orgaoExpedicao = :orgaoExpedicao"), @NamedQuery(name = "Funcionario.findByDeficiente", query = "SELECT f FROM Funcionario f WHERE f.deficiente = :deficiente"), @NamedQuery(name = "Funcionario.findByNumeroDependente", query = "SELECT f FROM Funcionario f WHERE f.numeroDependente = :numeroDependente"), @NamedQuery(name = "Funcionario.findByMae", query = "SELECT f FROM Funcionario f WHERE f.mae = :mae"), @NamedQuery(name = "Funcionario.findByPai", query = "SELECT f FROM Funcionario f WHERE f.pai = :pai"), @NamedQuery(name = "Funcionario.findByNaturalidade", query = "SELECT f FROM Funcionario f WHERE f.naturalidade = :naturalidade"), @NamedQuery(name = "Funcionario.findByNacionalidade", query = "SELECT f FROM Funcionario f WHERE f.nacionalidade = :nacionalidade"), @NamedQuery(name = "Funcionario.findByDataUltimaAlteracao", query = "SELECT f FROM Funcionario f WHERE f.dataUltimaAlteracao = :dataUltimaAlteracao")})
public class Funcionario implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "funcionario_id")
    private Integer funcionarioId;
    @Basic(optional = false)
    @Column(name = "data_admissao")
    @Temporal(TemporalType.DATE)
    private Date dataAdmissao;
    @Basic(optional = false)
    @Column(name = "data_nascimento")
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;
    @Basic(optional = false)
    @Column(name = "cbo")
    private String cbo;
    @Basic(optional = false)
    @Column(name = "ctps")
    private String ctps;
    @Basic(optional = false)
    @Column(name = "serie")
    private String serie;
    @Basic(optional = false)
    @Column(name = "cpf")
    private String cpf;
    @Basic(optional = false)
    @Column(name = "rg")
    private String rg;
    @Basic(optional = false)
    @Column(name = "orgao_expedicao")
    private String orgaoExpedicao;
    @Basic(optional = false)
    @Column(name = "deficiente")
    private boolean deficiente;
    @Basic(optional = false)
    @Column(name = "numero_dependente")
    private int numeroDependente;
    @Basic(optional = false)
    @Column(name = "mae")
    private String mae;
    @Basic(optional = false)
    @Column(name = "pai")
    private String pai;
    @Basic(optional = false)
    @Column(name = "naturalidade")
    private String naturalidade;
    @Basic(optional = false)
    @Column(name = "nacionalidade")
    private String nacionalidade;
    @Basic(optional = false)
    @Column(name = "data_ultima_alteracao")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataUltimaAlteracao;
    @JoinTable(name = "manutencao_funcionario", joinColumns = {@JoinColumn(name = "funcionario_id", referencedColumnName = "funcionario_id")}, inverseJoinColumns = {@JoinColumn(name = "manutencao_id", referencedColumnName = "manutencao_id")})
    @ManyToMany(fetch = FetchType.LAZY)
    private List<Manutencao> manutencaoCollection;
    @OneToMany(mappedBy = "funcionarioId", fetch = FetchType.LAZY)
    private List<Compra> compraCollection;
    @JoinColumn(name = "usuario_id", referencedColumnName = "usuario_id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Usuario usuarioId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "funcionarioId", fetch = FetchType.LAZY)
    private List<Venda> vendaCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "funcionarioId", fetch = FetchType.LAZY)
    private List<FolhaPagamento> folhaPagamentoCollection;

    public Funcionario() {
    }

    public Funcionario(Integer funcionarioId) {
        this.funcionarioId = funcionarioId;
    }

    public Funcionario(Integer funcionarioId, Date dataAdmissao, Date dataNascimento, String cbo, String ctps, String serie, String cpf, String rg, String orgaoExpedicao, boolean deficiente, int numeroDependente, String mae, String pai, String naturalidade, String nacionalidade, Date dataUltimaAlteracao) {
        this.funcionarioId = funcionarioId;
        this.dataAdmissao = dataAdmissao;
        this.dataNascimento = dataNascimento;
        this.cbo = cbo;
        this.ctps = ctps;
        this.serie = serie;
        this.cpf = cpf;
        this.rg = rg;
        this.orgaoExpedicao = orgaoExpedicao;
        this.deficiente = deficiente;
        this.numeroDependente = numeroDependente;
        this.mae = mae;
        this.pai = pai;
        this.naturalidade = naturalidade;
        this.nacionalidade = nacionalidade;
        this.dataUltimaAlteracao = dataUltimaAlteracao;
    }

    public Integer getFuncionarioId() {
        return funcionarioId;
    }

    public void setFuncionarioId(Integer funcionarioId) {
        this.funcionarioId = funcionarioId;
    }

    public Date getDataAdmissao() {
        if (dataAdmissao == null) {
            dataAdmissao = new Date();
        }
        return dataAdmissao;
    }

    public void setDataAdmissao(Date dataAdmissao) {
        this.dataAdmissao = dataAdmissao;
    }

    public Date getDataNascimento() {
         if (dataNascimento == null) {
            dataNascimento = new Date();
        }
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public String getCbo() {
        return cbo;
    }

    public void setCbo(String cbo) {
        this.cbo = cbo;
    }

    public String getCtps() {
        return ctps;
    }

    public void setCtps(String ctps) {
        this.ctps = ctps;
    }

    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getOrgaoExpedicao() {
        return orgaoExpedicao;
    }

    public void setOrgaoExpedicao(String orgaoExpedicao) {
        this.orgaoExpedicao = orgaoExpedicao;
    }

    public boolean getDeficiente() {
        return deficiente;
    }

    public void setDeficiente(boolean deficiente) {
        this.deficiente = deficiente;
    }

    public int getNumeroDependente() {
        return numeroDependente;
    }

    public void setNumeroDependente(int numeroDependente) {
        this.numeroDependente = numeroDependente;
    }

    public String getMae() {
        return mae;
    }

    public void setMae(String mae) {
        this.mae = mae;
    }

    public String getPai() {
        return pai;
    }

    public void setPai(String pai) {
        this.pai = pai;
    }

    public String getNaturalidade() {
        return naturalidade;
    }

    public void setNaturalidade(String naturalidade) {
        this.naturalidade = naturalidade;
    }

    public String getNacionalidade() {
        return nacionalidade;
    }

    public void setNacionalidade(String nacionalidade) {
        this.nacionalidade = nacionalidade;
    }

    public Date getDataUltimaAlteracao() {
        return dataUltimaAlteracao;
    }

    public void setDataUltimaAlteracao(Date dataUltimaAlteracao) {
        this.dataUltimaAlteracao = dataUltimaAlteracao;
    }

    public List<Manutencao> getManutencaoCollection() {
        return manutencaoCollection;
    }

    public void setManutencaoCollection(List<Manutencao> manutencaoCollection) {
        this.manutencaoCollection = manutencaoCollection;
    }

    public List<Compra> getCompraCollection() {
        return compraCollection;
    }

    public void setCompraCollection(List<Compra> compraCollection) {
        this.compraCollection = compraCollection;
    }

    public Usuario getUsuarioId() {
        return usuarioId;
    }

    public void setUsuarioId(Usuario usuarioId) {
        this.usuarioId = usuarioId;
    }

    public List<Venda> getVendaCollection() {
        return vendaCollection;
    }

    public void setVendaCollection(List<Venda> vendaCollection) {
        this.vendaCollection = vendaCollection;
    }

    public List<FolhaPagamento> getFolhaPagamentoCollection() {
        return folhaPagamentoCollection;
    }

    public void setFolhaPagamentoCollection(List<FolhaPagamento> folhaPagamentoCollection) {
        this.folhaPagamentoCollection = folhaPagamentoCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (funcionarioId != null ? funcionarioId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Funcionario)) {
            return false;
        }
        Funcionario other = (Funcionario) object;
        if ((this.funcionarioId == null && other.funcionarioId != null) || (this.funcionarioId != null && !this.funcionarioId.equals(other.funcionarioId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return getUsuarioId().getNome();
    }
}
